// #include <stdio.h>
// #include <stdlib.h>
// #include "windows.h"
// #define MAX_SIZE 100  // 定义栈的最大容量
//
// // 栈结构体
// typedef struct {
//     int base[MAX_SIZE]; // 使用数组作为顺序栈的存储结构
//     int top;            // 栈顶指针，指向栈顶元素的位置
// } Stack;
//
// // 初始化栈
// void initStack(Stack* s) {
//     s->top = -1; // 初始化栈顶指针为 -1，表示栈为空
// }
//
// // 输出栈中的元素
// void printStack(const Stack* s) {
//     if (s->top == -1) {
//         printf("栈为空！\n");
//         return;
//     }
//     printf("栈中的元素: ");
//     for (int i = 0; i <= s->top; i++) {
//         printf("%d ", s->base[i]);
//     }
//     printf("\n");
// }
//
// // 判断栈是否为空
// int stackEmpty(const Stack* s) {
//     return s->top == -1;
// }
//
// // 判断栈是否已满
// int stackFull(const Stack* s) {
//     return s->top == MAX_SIZE - 1;
// }
//
// // 进栈操作
// int push(Stack* s, int e) {
//     if (stackFull(s)) {
//         printf("栈已满，无法进栈！\n");
//         return -1; // 栈满，进栈失败
//     }
//     s->base[++s->top] = e; // 栈顶指针后移并将元素 e 压入栈顶
//     return 0; // 进栈成功
// }
//
// // 出栈操作
// int pop(Stack* s, int* e) {
//     if (stackEmpty(s)) {
//         printf("栈为空，无法出栈！\n");
//         return -1; // 栈空，出栈失败
//     }
//     *e = s->base[s->top--]; // 将栈顶元素赋值给 e，并将栈顶指针前移
//     return 0; // 出栈成功
// }
//
// // 获取栈顶元素
// int getTop(const Stack* s, int* e) {
//     if (stackEmpty(s)) {
//         printf("栈为空！\n");
//         return -1; // 栈空，无法获取栈顶元素
//     }
//     *e = s->base[s->top]; // 将栈顶元素赋值给 e
//     return 0; // 获取栈顶元素成功
// }
//
// // 测试代码
// int main() {
//     SetConsoleOutputCP(CP_UTF8); // 设置控制台输出为 UTF-8
//
//     Stack s; // 定义栈
//     int e;   // 存储出栈或获取的栈顶元素
//
//     initStack(&s); // 初始化栈
//
//     // 进栈操作
//     push(&s, 10);
//     push(&s, 20);
//     push(&s, 30);
//     printf("进栈后: \n");
//     printStack(&s);
//
//     // 获取栈顶元素
//     if (getTop(&s, &e) == 0) {
//         printf("栈顶元素: %d\n", e);
//     }
//
//     // 出栈操作
//     if (pop(&s, &e) == 0) {
//         printf("出栈元素: %d\n", e);
//     }
//     printf("出栈后: \n");
//     printStack(&s);
//
//     // 再次出栈
//     if (pop(&s, &e) == 0) {
//         printf("出栈元素: %d\n", e);
//     }
//     printf("出栈后: \n");
//     printStack(&s);
//
//     // 判断栈是否为空
//     if (stackEmpty(&s)) {
//         printf("栈为空\n");
//     } else {
//         printf("栈不为空\n");
//     }
//
//     // 清空栈并继续操作
//     if (pop(&s, &e) == 0) {
//         printf("出栈元素: %d\n", e);
//     }
//     printf("清空后: \n");
//     printStack(&s);
//
//     // 再次判断栈是否为空
//     if (stackEmpty(&s)) {
//         printf("栈为空\n");
//     } else {
//         printf("栈不为空\n");
//     }
//
//     return 0;
// }
